//TODO 25/6/05
/*
入门简单精通难
函数式编程
什么是函数
函数就是一段代码的集合
go语言中至少要有一个 main函数
函数需要有一个名字，独立定义的情况下。见名知意
函数可能需要有一个结果，也可能没有
*/
package main

import "fmt"

func main1() {
	printHelloWorld()
}
func printHelloWorld() {
	fmt.Println("Hello,world")
}

//注意：函数和方法完全是不一样的东西，面向对象里面才有方法

/*
函数的具体定义
无参无返回值
有一个参数的函数
有两个 or 多个参数的函数
有一个返回值的函数
有两个 or 多个返回值的函数
*/
func main2() {
	var m int
	m = max(123123123, 12312312312312)
	fmt.Println(m)
}

/*
func 函数名(参数1,参数2) 返回值类型 {
   // 代码逻辑

   return xxx
}
*/
// 定义一个稍微复杂一点的函数
// 比大小的函数 max ，两个数字比大小
// max函数，需要两个参数，int 类型的，比完大小之后我希望返回大的那一个数值
func max(num1 int, num2 int) int {
	var result int
	if num2 > num1 {
		result = num2
	} else {
		result = num1
	}
	// return返回结果
	return result
}

// 多个返回值的函数定义
// 案例：交换两个string
// 有多个返回值的情况下，返回值要用括号括起来
func swap(x string, y string) (string, string) {
	return y, x
}
func main3() {
	var a, b string = swap("why", "xjy")
	fmt.Println(a, b)
	c, d := swap("dwt", "mw")
	fmt.Println(c, d)
	e, _ := swap("利", "剑")
	fmt.Println(e)
}

//多个返回的案例

// 周长、面积案例  （长方形 ... 长、宽）
// 返回多个值，需要括号，需要表明返回值类型，返回值也可以命名
// return的结果值命名和定义函数返回值的命名无关
func fun1(len, wid float64) (float64, float64) {
	area := len * wid
	zc := (len + wid) * 2
	/*return area, zc*/
	return zc, area
}

// 所以return的结果命名和定义函数返回值的命名无关
//1.return 如果直接定义了，那么返回的结果按照return的顺序 ：return area, zc
//上面返回值的参数是zc area的顺序，但是结果是area，zc的顺序，所以与其return的定义的顺序有关
//2.直接调用return 不带结果，那么则按那个返回值的定义的参数的顺序来进行返回

// 1、return 如果直接定义了，那么返回结果按照 return 的顺序
// 2、直接调用return不带结果，那么则返回 函数返回值定义的顺序进行结果返回。

func main() {
	ret1, _ := fun1(2, 4)
	fmt.Println(ret1)
}

//func1还有其他的方式
/*
func fun1(len, wid float64) (zc float64, area float64) {
	area = len * wid
	zc = (len + wid) * 2
	fmt.Println("zc:", zc)
	fmt.Println("area:", area)
	return
*/

//在Java中，我们都会使用map进行封装，来返回多个参数，在go语言中可以直接返回多个参数
